package org.jboss.arquillian.warp.extensions.phaser;
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import javax.faces.context.FacesContextFactory;
import javax.faces.context.FacesContextWrapper;
import javax.faces.lifecycle.Lifecycle;
import javax.servlet.http.HttpServletRequest;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.warp.spi.LifecycleManagerStore;
import org.jboss.arquillian.warp.spi.ObjectAlreadyAssociatedException;
import org.jboss.arquillian.warp.spi.ObjectNotAssociatedException;
import org.jboss.arquillian.warp.spi.WarpCommons;
public class PhaserContextFactoryWrapper extends FacesContextFactory {
public static final String INITIALIZED = PhaserContextFactoryWrapper.class.getName() + ".INITIALIZED";
private FacesContextFactory delegate;
public PhaserContextFactoryWrapper(FacesContextFactory facesContextFactory) {
delegate = facesContextFactory;
}
public FacesContext getFacesContext(Object context, Object request, Object response, Lifecycle lifecycle)
throws FacesException {
FacesContext facesContext = new WrappedFacesContext(delegate.getFacesContext(context, request, response, lifecycle));
if (request instanceof HttpServletRequest) {
HttpServletRequest httpReq = (HttpServletRequest) request;
@SuppressWarnings("unchecked")
Instance<LifecycleManagerStore> store = (Instance<LifecycleManagerStore>) httpReq
.getAttribute(WarpCommons.LIFECYCLE_MANAGER_STORE_REQUEST_ATTRIBUTE);
facesContext.getAttributes().put(INITIALIZED, Boolean.FALSE);
if (store != null && store.get() != null) {
try {
store.get().bind(FacesContext.class, facesContext);
facesContext.getAttributes().put(INITIALIZED, Boolean.TRUE);
} catch (ObjectAlreadyAssociatedException e) {
throw new IllegalStateException(e);
}
}
}
return facesContext;
}
public class WrappedFacesContext extends FacesContextWrapper {
private FacesContext wrapped;
public WrappedFacesContext(FacesContext wrapped) {
this.wrapped = wrapped;
}
@Override
public FacesContext getWrapped() {
return wrapped;
}
@Override
public void release() {
try {
Object request = this.getExternalContext().getRequest();
if (request instanceof HttpServletRequest) {
HttpServletRequest httpReq = (HttpServletRequest) request;
@SuppressWarnings("unchecked")
Instance<LifecycleManagerStore> store = (Instance<LifecycleManagerStore>) httpReq
.getAttribute(WarpCommons.LIFECYCLE_MANAGER_STORE_REQUEST_ATTRIBUTE);
if (store != null && store.get() != null) {
try {
store.get().unbind(FacesContext.class, this);
} catch (ObjectNotAssociatedException e) {
throw new IllegalStateException(e);
}
}
}
} finally {
super.release();
}
}
}
}